package com.cdtu;

import com.cdtu.utils.Crc16Utils;
import com.cdtu.utils.FileUtils;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * @author Mika
 * @date 2025/02/28 13:45
 * 控制/恢复 指令
 **/
public class Order {
    public static List<String> FIXED_HEAD_PARAMS = new ArrayList(Arrays.asList("EE", "EE", "00", "11"));//固定头部参数
    public static List<String> SOURCE_ID = Arrays.asList("00");//源ID（可为00 也可为0A）
    public static List<String> COMMAND = Arrays.asList("12");//控制命令  //（固定）
    public static List<String> TIMESTAMP = Arrays.asList("00", "00", "00", "00");//分站时间 （可为下发命令时间）
    public static List<String> FIXED_REAR_PARAMS = Arrays.asList("A5", "A5", "FF", "FF");
    // 保留位
    public static final List<String> RESERVED_BITS = Arrays.asList("00", "00", "00", "00", "00");

    // 生成命令：控制/恢复命令
    public static String[] generateOrder(int controlFlag, JsonNode sendObj) {
        List<String> CRCTmpList = new ArrayList<>();
        List<String> tmpAllList = new ArrayList<>();
        // 添加控制命令
        // 源 ID
        CRCTmpList.addAll(SOURCE_ID);
        CRCTmpList.add(sendObj.get("deviceType").asText());
        // 控制命令
        CRCTmpList.addAll(COMMAND);
        CRCTmpList.add(sendObj.get("deviceMac").asText());
        // 分站时间
        CRCTmpList.addAll(TIMESTAMP);
        // 控制字
        if (controlFlag == 2) {
            CRCTmpList.add("02"); // 其它控制等级
        }
        if (controlFlag == 1) {
            CRCTmpList.add("01"); // 控制
        }
        if (controlFlag == 0) {
            CRCTmpList.add("00"); // 恢复
        }

        // 保留位
        CRCTmpList.addAll(RESERVED_BITS);
        // 转成字符串
        String str = Crc16Utils.byteTo16String(Crc16Utils.getData(CRCTmpList.toArray(new String[CRCTmpList.size()]))).toUpperCase();
        //固定头部参数
        tmpAllList.addAll(FIXED_HEAD_PARAMS);
        // 链路
        tmpAllList.add(sendObj.get("chainID").asText());
        tmpAllList.addAll(new ArrayList<>(Arrays.asList(str.split(" "))));
        // crc 校验用的，以及数据帧尾
        tmpAllList.addAll(FIXED_REAR_PARAMS);
        return tmpAllList.toArray(new String[tmpAllList.size()]);
    }
}
